package com.leyou.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.leyou.entity.BrandEntity;
import com.leyou.entity.CategoryBrandEntity;
import com.leyou.service.CategoryBrandService;
import com.leyou.vo.catelogVo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.leyou.dao.CategoryDao;
import com.leyou.entity.CategoryEntity;
import com.leyou.service.CategoryService;


@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {


    @Autowired
    private CategoryBrandService categoryBrandService;

    @Autowired
    StringRedisTemplate redisTemplate;
    
    @Override
    public List<CategoryEntity> getListlevl(Long pid) {
        List<CategoryEntity> list = this.list(new QueryWrapper<CategoryEntity>().eq("parent_id", pid));
        return list;
    }

    /**
     * 全部商品的3级分类 树型结构显示数据
     **/
    @Override
    public List<catelogVo> getList() {
        /**
         *  由于三级分类是不经常变更且庞大的数据   
         *  所有存入redis中更为合适 但是得设置过期时间 保证数据的及时更新
         *      
         */
        // 1. 从redis中取出数据 
        String catelog = redisTemplate.opsForValue().get("leyouo:catelog");
        //  判断数据是否存在  不存在就存入一份  否则直接返回
        if(StringUtils.isEmpty(catelog)){
              // 不存在 获取数据
            List<catelogVo> result =  fingCatelogIds();
            redisTemplate.opsForValue().set("leyouo:catelog",JSON.toJSONString(result));
        }
        // 将string数据转为集合
        List<catelogVo> result = JSON.parseObject(redisTemplate.opsForValue().get("leyouo:catelog"),new TypeReference<List<catelogVo>>(){});
        return result;
    }

    /**
     * 获取三级分类树型数据
     * @return
     */
    private List<catelogVo> fingCatelogIds() {
        // 获取所有分类数据
        List<CategoryEntity> list = this.list();
        //找到所有的一级分类
        List<catelogVo> level1Menus = list.stream()
                .filter(item -> item.getParentId() == 0)
                .map(menu->{
                    catelogVo vo = new catelogVo();
                    BeanUtils.copyProperties(menu,vo);
                    vo.setChildrens(getChildrens(list,menu));
                    return vo;
                })
                .sorted((menu1, menu2) -> {  // 排序
                    return (menu1.getSort() ==null ? 0:menu1.getSort())- (menu2.getSort()==null?0:menu2.getSort());
                })
                .collect(Collectors.toList());
        return level1Menus;
    }

    /**
     *  递归查询 该分类的上的 所有子分类
     * @param list  所有分类的数据
     * @param category  单个分类的对象
     * @return
     */
    private List<catelogVo> getChildrens(List<CategoryEntity> list,CategoryEntity category){
        List<catelogVo> collect = list.stream().filter(fir -> {
            //  如果一个分类a的父类id ==  一个分类b的id  那么a是b的子分类
            return fir.getParentId() == category.getId();
        }).map(item -> {  //收集数据
            catelogVo vo = new catelogVo();
            BeanUtils.copyProperties(item,vo);
            vo.setChildrens(getChildrens(list,item));
            return vo;
        }).sorted((menu1, menu2) -> {  //排序
            return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
        }).collect(Collectors.toList());
        return collect;
    }

    /**
     * 获取三级分类id 完整名称
     * @param cid1
     * @param cid2
     * @param cid3
     * @return
     */
    @Override
    public String getCategoryAllNameByid(Long cid1, Long cid2, Long cid3) {
        CategoryEntity levl1 = getById(cid1);
        CategoryEntity levl2 = getById(cid2);
        CategoryEntity levl3 = getById(cid3);
        String cname = levl1.getName()+"/"+levl2.getName()+"/"+levl3.getName();
        return cname;
    }

    /**
     * 根据品牌id获取分类的信息
     * @param bid
     * @return
     */
    @Override
    public List<CategoryEntity> getInfoByBrandId(Long bid) {
        List<CategoryBrandEntity> ategoryList = categoryBrandService.getInfoBybreadId(bid);
        if(ategoryList != null && ategoryList.size()>0){
            List<Long> longs = ategoryList.stream().map(item -> {
                return item.getCategoryId();
            }).collect(Collectors.toList());
            return this.listByIds(longs);
        }
        return null;
    }
}